﻿package com.eleme.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;


  
/** 
 * ClassName: IBaseDao <br/> 
 * Function: Dao公共基类. <br/> 
 * Reason: 提供了一些公共方法实现。运用了反射，要求：<br/>
 * 实体类T对应的表有且仅有单主键，主键名为“id” <br/>
 * date: 2017年12月22日 下午2:40:53 <br/> 
 * 
 * @author Pan 
 * @version @param <T> 
 * @since JDK 1.8 
 */  
public interface IBaseDao<T> {
	
	/** 
	 * getConnection:获得数据库连接. <br/> 
	 * 
	 * @author Pan 
	 * @return 
	 * @since JDK 1.8 
	 */ 
	Connection getConnection();
	
	/** 
	 * getStatment:获取执行sql语句的Statement对象. <br/>
	 * 注意： 不推荐使用此方法，应该使用PrepareStatement，可以防止Sql注入攻击。
	 * 
	 * @author Pan 
	 * @return 
	 * @since JDK 1.8 
	 */ 
	Statement getStatment();
	
	/** 
	 * insert:根据传入实体类在数据库增加一条记录. <br/> 
	 * 注意：当实体类属性和表字段不匹配时应重写此方法。
	 * 
	 * @author Pan 
	 * @param entity
	 * @return 插入的行数
	 * @since JDK 1.8 
	 */ 
	int insert(T entity);

	/** 
	 * delete:根据传入id删除表中一条记录. <br/> 
	 * 注意：主键必须为单主键“id”，否则应重写此方法。
	 * 
	 * @author Pan 
	 * @param id
	 * @return 
	 * @since JDK 1.8 
	 */ 
	int delete(int id);

	/** 
	 * update:根据传入实体对象更新表中对应id的记录. <br/>
	 * 注意： 主键不为单主键“id”，或实体类属性和表字段不匹配时，应重写此方法。
	 * 
	 * @author Pan 
	 * @param entity
	 * @param id
	 * @return 
	 * @since JDK 1.8 
	 */ 
	int update(T entity, int id);
	

	/** 
	 * getById:根据id获得一个实体类实例. <br/> 
	 * 注意： 主键不为单主键“id”，或实体类属性和表字段不匹配时，应重写此方法。
	 * 
	 * @author Pan 
	 * @param id
	 * @return 
	 * @since JDK 1.8 
	 */ 
	T getById(int id);
	
 
	/** 
	 * getAll:查询实体类对应表中所有记录，作为列表返回. <br/> 
	 * 注意：实体类属性和表字段不匹配时，应重写此方法。<br/>
	 * 警告：慎用此方法，当且仅当表中数据量很少时才应使用。
	 * 
	 * @author Pan 
	 * @return 
	 * @since JDK 1.8 
	 */ 
	List<T> getAll();
	
}
